#ifndef DIRECTDATACHANNEL_H
#define DIRECTDATACHANNEL_H

#include <QObject>
#include <QTimer>
#include <QMutex>
#include <QJsonObject>

// 前向声明
class WebSocketClient;
class UnifiedGameRenderer;

/**
 * @brief 游戏状态信息结构（UI显示用）
 */
struct GameStateInfo {
    int score = 0;
    int alivePlayers = 0;
    int totalPlayers = 0;
    QString gameStatus = "未知";
    qint64 timestamp = 0;
    
    // 性能信息
    int currentFPS = 0;
    double avgLatency = 0.0;
};

/**
 * @brief 直接数据通道
 * 
 * 解决数据传递冗余问题：
 * - 跳过中间层，直接连接WebSocket和渲染器
 * - 减少4ms的传递延迟
 * - 简化数据流路径
 */
class DirectDataChannel : public QObject
{
    Q_OBJECT

public:
    explicit DirectDataChannel(QObject *parent = nullptr);
    ~DirectDataChannel();
    
    /**
     * @brief 连接WebSocket客户端
     * @param client WebSocket客户端指针
     */
    void connectWebSocket(WebSocketClient *client);
    
    /**
     * @brief 连接统一渲染器
     * @param renderer 统一渲染器指针
     */
    void connectRenderer(UnifiedGameRenderer *renderer);
    
    /**
     * @brief 启动数据通道
     */
    void start();
    
    /**
     * @brief 停止数据通道
     */
    void stop();
    
    /**
     * @brief 是否正在运行
     */
    bool isRunning() const { return m_running; }
    
    /**
     * @brief 性能统计结构
     */
    struct PerformanceStats {
        int messagesProcessed = 0;      // 已处理消息数
        int messagesDropped = 0;        // 丢弃消息数
        qint64 totalLatency = 0;        // 总延迟(ms)
        qint64 averageLatency = 0;      // 平均延迟(ms)
        qint64 minLatency = 0;          // 最小延迟(ms)
        qint64 maxLatency = 0;          // 最大延迟(ms)
        double throughput = 0.0;        // 吞吐量(消息/秒)
    };
    
    /**
     * @brief 获取性能统计
     */
    PerformanceStats getPerformanceStats() const;
    
    /**
     * @brief 打印性能统计
     */
    void printPerformanceStats() const;

signals:
    /**
     * @brief 游戏状态信息变化信号（UI用）
     * @param info 游戏状态信息
     */
    void gameStateChanged(const GameStateInfo &info);
    
    /**
     * @brief 游戏结束信号
     * @param reason 结束原因
     */
    void gameEnded(const QString &reason);
    
    /**
     * @brief 连接错误信号（网络/连接层）
     * @param error 错误信息
     */
    void connectionError(const QString &error);

    /**
     * @brief 游戏业务错误信号（不会中断数据通道）
     * @param error 错误信息
     */
    void gameError(const QString &error);

    /**
     * @brief 性能统计更新信号
     * @param stats 性能统计数据
     */
    void performanceStatsUpdated(const PerformanceStats &stats);

public slots:
    /**
     * @brief WebSocket消息处理
     * @param message JSON消息
     */
    void onWebSocketMessage(const QJsonObject &message);

private slots:
    
    /**
     * @brief 游戏结束处理
     * @param reason 结束原因
     */
    void onGameEnded(const QString &reason);
    
    /**
     * @brief 性能统计定时器
     */
    void onPerformanceTimer();

    /**
     * @brief 处理缓存的消息
     */
    void processPendingMessages();

private:
    /**
     * @brief 处理游戏状态更新消息
     * @param message 游戏状态消息
     */
    void processGameStateUpdate(const QJsonObject &message);
    
    /**
     * @brief 提取游戏状态信息（UI用）
     * @param gameState 完整游戏状态
     * @return 提取的状态信息
     */
    GameStateInfo extractGameStateInfo(const QJsonObject &gameState);
    
    /**
     * @brief 更新性能统计
     * @param messageTime 消息时间戳
     */
    void updatePerformanceStats(qint64 messageTime);
    
    // === 连接组件 ===
    WebSocketClient *m_webSocketClient;
    UnifiedGameRenderer *m_renderer;
    
    // === 运行状态 ===
    bool m_running;
    
    // === 性能监控 ===
    QTimer *m_performanceTimer;
    mutable QMutex m_statsMutex;
    PerformanceStats m_stats;
    qint64 m_lastMessageTime;
    qint64 m_lastStatsUpdate;
    
    // === 消息过滤 ===
    QStringList m_supportedMessageTypes;

    // === 消息缓存（处理启动时序问题） ===
    QList<QJsonObject> m_pendingMessages;
    QTimer *m_retryTimer;

    // === 房间与结束态去抖 ===
    QString m_currentRoomId;           // 当前房间ID（用于匹配room_state_change）
    int m_consecutiveFinished = 0;     // 连续收到FINISHED计数

    static const int STATS_UPDATE_INTERVAL = 1000; // 1秒更新一次统计
    static const int RETRY_INTERVAL = 100; // 重试间隔100ms
};

Q_DECLARE_METATYPE(GameStateInfo)
Q_DECLARE_METATYPE(DirectDataChannel::PerformanceStats)

#endif // DIRECTDATACHANNEL_H
